#pragma once

#define UTSC_KERNEL_EXPORTS

#ifdef _MSC_VER
#ifdef UTSC_KERNEL_EXPORTS
#define UTSC_KERNEL_API __declspec(dllexport)
#else
#define UTSC_KERNEL_API __declspec(dllimport)
#endif
#else   // Linux GCC
#define UTSC_KERNEL_API
#endif

#include"../LibUTSCBase/UTSCDefine.hpp"

_NNU_UTSC_BEGIN
using namespace NNU::UTSC::Base;
namespace Kernel{
    ///实现时间和编码的转化
    Interface IUTSCKernel
    {
        /// <summary>
        /// 时间编码核心库初始化
        /// </summary>
        virtual void init() = 0;

        /// <summary>
        /// 时间编码核心库卸载
        /// </summary>
        virtual void release() = 0;


        /// <summary>
        /// 将时间转化为时间编码（时间点）
        /// </summary>
        /// <param name="time">原始时间</param>
        /// <param name="code">编码结果</param>
        /// <returns></returns>
        virtual bool encode(UTSCTime* time,UTSCElementCode *&code)=0;


        /// <summary>
        /// 将时间转化为时间编码（时间片段）
        /// </summary>
        /// <param name="time">开始时间</param>
        /// <param name="end">结束时间</param>
        /// <param name="code">编码结果</param>
        /// <returns></returns>
        virtual bool encode(UTSCTime* start, UTSCTime* end, std::vector<UTSCElementCode>& code) = 0;


        /// <summary>
        /// 将时间编码转化时间（时间点）
        /// </summary>
        /// <param name="code">编码时间</param>
        /// <param name="time">解码结果</param>
        virtual bool decode(UTSCElementCode *code, UTSCTime* &time)=0;
   
        /// <summary>
        /// 将时间编码转化时间（时间片段）
        /// </summary>
        /// <param name="time">编码时间</param>
        /// <param name="start">解码开始时间结果</param>
        /// <param name="end">解码结束时间结果</param>
        virtual bool decode(std::vector<UTSCElementCode> const& codes, UTSCTime*& start, UTSCTime*& end) = 0;


        /// <summary>
        /// 对时间点的层级关系查询：Parent层级查询，返回一个时间点；Children层级查询，返回两个时间点；Neighbor层级查询，返回两个时间点
        /// </summary>
        /// <param name="topoType">需要查询的类型</param>
        /// <param name="code">查询对象</param>
        /// <param name="result">查询结果</param>
        /// <param name="size">查询结果中包含的时间点数量</param>
        /// <returns></returns>
        virtual bool structQuery(UTSCStructType topoType,UTSCElementCode *code, UTSCElementCode*&result, int& size)=0;

        /// <summary>
        /// 时间拓扑关系查询，共三种情况的查询。一共十三种关系
        /// 1.时间点与时间点之间的拓扑关系查询：A在B之前Before，A在B之后After，相同Equal
        /// 2.时间点与时间片段之间的拓扑关系查询：A在B之前Before，A在B之后After，A与B的起点相同StartWith，A与B的终点相同FinishWith，A在B的中间ContainedBy
        /// 3.时间片段与时间片段之间的拓扑关系查询:
        /// A在B之前Before，A在B之后After，A和B一起开始（A比B短）StartWith，A和B一起开始（A比B长）StartBy，A和B一起结束（A比B短）FinishWith，A和B一起结束（A比B长）FinishBy
        /// A和B相等Equal，A和B相交叉（A比B早），OverlapWith，A和B相交叉（A比B晚）OverlapBy，A包含B Contain，A被B包含ContainedBy，A和B错开（A开始，B结束）MetBy，A和B错开（A结束，B开始）MeetWith
        /// </summary>
        /// <param name="code1">编码1</param>
        /// <param name="code2">编码2</param>
        /// <param name="type">查询对象的类型：type=1：时间点与时间点查询；type=2：时间点与时间片段查询；type=3：时间片段与时间片段查询</param>
        /// <returns></returns>
        virtual UTSCTopoType topoQuery(UTSCElementCode*code1, UTSCElementCode*code2,int type)=0;

        bool encode(UTSCTime &time,UTSCElementCode &code);

        bool decode(UTSCElementCode &code, UTSCTime &time);

        bool structQuery(UTSCStructType topoType, UTSCElementCode &code, TimeElementCodeStruct &result);

        UTSCTopoType topoQuery(TimeElementCodeStruct &code1, TimeElementCodeStruct &code2, int type);
    };

    /// <summary>
    /// 创建IUTSCKernel类对象
    /// </summary>
    /// <returns></returns>
    extern "C" UTSC_KERNEL_API IUTSCKernel* CreateKernelObj();

    /// <summary>
    /// 销毁IUTSCKernel类对象
    /// </summary>
    /// <param name="pKernel"></param>
    extern "C" UTSC_KERNEL_API  void DestroyKernelObj(IUTSCKernel * pKernel);
}


_NNU_UTSC_END
